iT邦幫忙

1

Python 資料建構式/ 推導式 Comprehension:高效創建資料結構(列表、字典和集合)

  • 分享至 

  • xImage
  •  

Comprehension 是什麼?
Python 的資料建構式/推導式(Comprehensions)是一種簡潔且具表達力的方式來建立列表、集合、字典或生成器。
這些語法結構通常包含條件邏輯,讓我們能夠在一行內完成資料篩選、轉換和構建。

如果還不了解列表 字典 集合 請先看下面的文章 了解基本概念:
Python {dictionaries 字典} Dict Comprehension

Python 列表 [list] List Comprehension 快速生成列表

Python {Sets 集合}和推導式 (Comprehension)

資料資料建構式/推導式的種類與比較

資料建構式種類 語法範例 用途
列表建構式 [x for x in iterable if condition] 產生列表,適合需多次訪問的數據
集合建構式 {x for x in iterable if condition} 產生集合,去除重複值
字典建構式 {k: v for k, v in iterable if cond} 產生字典,適合鍵值對映射數據
生成器建構式 (x for x in iterable if condition) 產生生成器,適合大量數據惰性求值
特性 列表建構式 集合建構式 字典建構式 生成器建構式
語法符號 [ ] { } { } ( )
輸出資料類型 list set dict generator
元素是否唯一 是(依鍵來唯一)
條件篩選 支援 支援 支援 支援
記憶體效率 中等 中等 中等

一般&快速資料建構式語法

一般資料建構式語法

x =[1,2,3,4]
squared_x = []
for item in x:
    squared_x.append(item * 2)
print(squared_x) #[2, 4, 6, 8]

快速資料建構式語法

squared_x = [item**2 for item in x]

快速資料建構式/Comprehension

列表(List Comprehension)

列表推導式是一種在單行中創建列表的語法。適合用來創建列表,語法清晰,速度通常比傳統的 for 迴圈快。
語法:
new_list = [expression for item in iterable if condition]

  • expression: 要添加到新列表中的元素。(運算式)
  • item: 迭代變量。
  • iterable: 可迭代對象,如列表、元組、字符串等。
  • condition: 可選的過濾條件。
# 創建一個包含0到9的平方數的列表
# 範例:產生平方數列表
squares = [x**2 for x in range(10)]
# 結果: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

# 創建一個包含所有偶數的列表
even_numbers = [x for x in range(20) if x % 2 == 0]
print(even_numbers)
#[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

# 創建一個包含所有大寫字母的列表
upper_letters = [letter.upper() for letter in 'hello world']
print(upper_letters )
#['H', 'E', 'L', 'L', 'O', ' ', 'W', 'O', 'R', 'L', 'D']

字典(Dict Comprehension)

使用大括號 {},並且需指定鍵:值對,適合用來生成基於某邏輯的字典。
語法:
new_dict = {key: value(operation) for item in iterable if condition}

  • key: 字典的鍵。
  • value: 字典的值。
  • operation 運算式
  • item: 迭代變量。
  • iterable: 可迭代對象。
  • condition: 可選的過濾條件。
# 範例:將數字及其平方作為鍵值對
square_dict = {x: x**2 for x in range(10)}
# 結果: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

# 創建一個計算水果名稱長度的字典
fruit_lengths = {fruit: len(fruit) for fruit in ['apple', 'banana', 'cherry']}
print(fruit_lengths)
{'apple': 5, 'banana': 6, 'cherry': 6}

集合建構式 (Set Comprehension)

使用花括號 {} 包裹,適合用來去除重複元素並生成集合。
new_ser={operation for variable in original_set if condition}

範例:找出一個英文句子中所有不重複的元音字母

sentence = "This is a sample sentence to demonstrate set comprehension."
vowels = {char for char in sentence if char in 'aeiouAEIOU'}
print(vowels)#{'a', 'e', 'i', 'o', 'u'}

解釋:
sentence = "This is a sample sentence to demonstrate set comprehension.": 定義一個包含英文句子的字串。
{char for char in sentence if char in 'aeiouAEIOU'}: 這是集合建構式:
char for char in sentence: 迭代 sentence 中的每個字元,並將每個字元賦值給變數 char。
if char in 'aeiouAEIOU': 判斷 char 是否為元音字母(不分大小寫)。
vowels: 將符合條件的字元放入一個集合中。集合會自動去除重複元素,因此最後 vowels 中只會包含不重複的元音字母。

執行結果:
這個範例展示了集合建構式的一些特點:

  • 篩選元素: 透過 if 條件,可以篩選出符合特定條件的元素。
  • 去除重複: 集合會自動去除重複元素,因此非常適合用來找出唯一元素。
  • 簡潔高效: 相較於傳統的 for 迴圈,集合建構式更為簡潔且高效。

另一個範例:從一個數字列表中找出所有大於 5 的奇數

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
odd_numbers_greater_than_5 = {num for num in numbers if num > 5 and num % 2 != 0}
print(odd_numbers_greater_than_5)#{7, 9}

生成器建構式 (Generator Expression)

生成器是一種特殊的迭代器。
它不像列表一次將所有元素存儲在內存中,而是在每次迭代時計算並返回下一個值。
這使得生成器非常適合處理大型資料集,因為它可以避免一次性將所有資料載入到記憶體中,從而節省記憶體。

使用小括號 () 包裹,返回一個生成器。
生成器不會一次性將所有結果存入記憶體,而是每次迭代時生成一個值,非常適合處理大量數據。

# 範例:建立一個生成平方數的生成器
square_gen = (x**2 for x in range(10))
# <generator object <genexpr> at 0x78937779db60>
#

為什麼會看到這個輸出? <generator object at 0x78937779db60>
當你直接打印一個生成器對象時,Python 會顯示它的類型(generator object)和記憶體地址。
這告訴你,這是一個生成器,但它並不會顯示生成器中的元素

generator object: 表示這是一個生成器對象。
<genexpr>: 表示這個生成器是通過生成器表達式(generator expression)創建的。
0x78937779db60: 是一個十六進位數字,代表這個生成器對象在記憶體中的具體位置。這個地址會隨著每次程式執行而改變。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言